/*******************************************************************************
 * Copyright (c) 2000, 2005 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package com.architexa.org.eclipse.gef.ui.palette;

import com.architexa.org.eclipse.gef.internal.Internal;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.swt.widgets.Control;
import org.eclipse.swt.widgets.Menu;

import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IMenuCreator;
import org.eclipse.jface.resource.ImageDescriptor;


/**
 * This action allows to switch between the various supported layout modes for the given
 * palette.
 * 
 * @author Pratik Shah
 */
public class LayoutAction 
	extends Action 
	implements IMenuCreator
{

private PaletteViewerPreferences prefs;
private List actions;

/**
 * Constructor
 * 
 * @param	prefs	PaletteViewerPreferences object where the settings can be saved
 */
public LayoutAction(PaletteViewerPreferences prefs) {
	this(prefs, false);
}

/**
 * Constructor
 * 
 * @param 	hasIcon True if this action should associate an icon with itself
 * @param	prefs	PaletteViewerPreferences object where the settings can be saved
 */
public LayoutAction(PaletteViewerPreferences prefs, boolean hasIcon) {
	super(PaletteMessages.LAYOUT_MENU_LABEL);
	this.prefs = prefs;
	actions = createActions();
	setMenuCreator(this);

	if (hasIcon)
		setImageDescriptor(ImageDescriptor.createFromFile(
			Internal.class, "icons/palette_layout.gif")); //$NON-NLS-1$
	
	setToolTipText(PaletteMessages.LAYOUT_MENU_LABEL);
}

/**
 * Helper method that wraps the given action in an ActionContributionItem and then adds it
 * to the given menu.
 * 
 * @param	parent	The menu to which the given action is to be added
 * @param	action	The action that is to be added to the given menu
 */
protected void addActionToMenu(Menu parent, IAction action) {
	ActionContributionItem item = new ActionContributionItem(action);
	item.fill(parent, -1);
}

/**
 * @return A list of actions that can switch to one of the supported layout modes
 */
protected List createActions() {
	ArrayList list = new ArrayList();
	int[] modes = prefs.getSupportedLayoutModes();
	
	Action action;
	for (int i = 0; i < modes.length; i++) {
		switch(modes[i]) {
			case PaletteViewerPreferences.LAYOUT_COLUMNS:
				action = new LayoutChangeAction(PaletteViewerPreferences.LAYOUT_COLUMNS);
				action.setText(PaletteMessages.SETTINGS_COLUMNS_VIEW_LABEL);
				list.add(action);
				break;
			case PaletteViewerPreferences.LAYOUT_LIST:
				action = new LayoutChangeAction(PaletteViewerPreferences.LAYOUT_LIST);
				action.setText(PaletteMessages.SETTINGS_LIST_VIEW_LABEL);
				list.add(action);
				break;
			case PaletteViewerPreferences.LAYOUT_ICONS:
				action = new LayoutChangeAction(PaletteViewerPreferences.LAYOUT_ICONS);
				action.setText(PaletteMessages.SETTINGS_ICONS_VIEW_LABEL_CAPS);
				list.add(action);
				break;
			case PaletteViewerPreferences.LAYOUT_DETAILS:
				action = new LayoutChangeAction(PaletteViewerPreferences.LAYOUT_DETAILS);
				action.setText(PaletteMessages.SETTINGS_DETAILS_VIEW_LABEL);
				list.add(action);
				break;
		}
	}
	return list;
}

/**
 * Empty method
 * 
 * @see org.eclipse.jface.action.IMenuCreator#dispose()
 */
public void dispose() {
}

private Menu fillMenu(Menu menu) {
	for (Iterator iter = actions.iterator(); iter.hasNext();) {
		LayoutChangeAction action = (LayoutChangeAction) iter.next();
		action.setChecked(prefs.getLayoutSetting() == action.getLayoutSetting());
		addActionToMenu(menu, action);
	}	
	
	setEnabled(!actions.isEmpty());
	
	return menu;
}

/**
 * @see org.eclipse.jface.action.IMenuCreator#getMenu(Control)
 */
public Menu getMenu(Control parent) {
	return fillMenu(new Menu(parent));	
}

/**
 * @see org.eclipse.jface.action.IMenuCreator#getMenu(Menu)
 */
public Menu getMenu(Menu parent) {
	return fillMenu(new Menu(parent));
}

private class LayoutChangeAction extends Action {
	private int value;
	public LayoutChangeAction(int layoutSetting) {
		value = layoutSetting;
	}
	public int getLayoutSetting() {
		return value;
	}
	public void run() {
		prefs.setLayoutSetting(value);
	}
}

}
